﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITProject.Repository.Abstract;
using ITProject.Domain.Entities;
using ITProject.Domain;
using System.Data;
using System.Data.Objects;
using System.Data.Entity.Infrastructure;

namespace ITProject.Repository.Concrete
{
    /// <summary>
    /// Repozytorium systemu wewnętrznych wiadomości.
    /// Autor: Jakub Szatkowski
    /// </summary>
    public class MessageRepository : IMessageRepository
    {
        private EFDataContext _dataContext = new EFDataContext();
        
        /// <summary>
        /// Metoda dodajaca do bazy informacje o nowo wysłanej wiadomości.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="message">Wiadomość.</param>
        public void Send(Message message)
        {
            message.Readed = false;
            message.DateOfSend = DateTime.Now;
            _dataContext.Message.Add(message);
            _dataContext.SaveChanges();
        }
        
        /// <summary>
        /// Metoda usuwająca z bazy informacje o wiadomości.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="message">Identyfikator wiadomości.</param>
        public void Delete(int messageId)
        {
            Message message = GetMessageById(messageId);
            _dataContext.Message.Remove(message);
            _dataContext.SaveChanges();
        }

        /// <summary>
        /// Metoda oznacza wiadomość jako przeczytaną. Gdy wysyłający zarzczy sobie potwierdzenia wysyłania wysyłana jest do niego wiadomość o przeczytaniu wiadomości.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="message">Wiadomość.</param>
        public void Read(Message message)
        {
            message.Readed = true;
            DbEntityEntry entry = _dataContext.Entry(message);
            entry.State = EntityState.Modified;
            // wyslanie potwierdzenia otrzymania wiadomości.
            if (message.ReadConfrimation)
            {
                Message confirm = new Message();
                confirm.DateOfSend = DateTime.Now;
                confirm.ReadConfrimation = false;
                confirm.Readed = false;
                confirm.Sender = 1;
                confirm.Receiver = message.Sender;
                confirm.Subject = "Potwierdzenie odebrania wiadomości";
                confirm.Text = "Użytkownik " + _dataContext.Users.Where(x => x.Id == message.Receiver).FirstOrDefault().Login + " przeczytał twoją wiadomość wysłaną " +
                    message.DateOfSend.ToString() + " o temacie: "+message.Subject+". Treść wiadomości: [quote]" + message.Text + "[/quote]";
                _dataContext.Message.Add(confirm);
            }
            _dataContext.SaveChanges();
        }

        /// <summary>
        /// Pobiera listę wiadomości, których odbiorcą jest użytkownik o id równym receiverId.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="ReceiverId">Id użytkownika, którego wiadomości pobieramy.</param>
        /// <returns>Lista wiadomości użytkownika.</returns>
        public IEnumerable<Message> GetInMessages(int receiverId)
        {
            return _dataContext.Message.Where(x => (x.Receiver == receiverId)).OrderByDescending(x=>x.DateOfSend).AsEnumerable();
        }

        /// <summary>
        /// Zwraca encje wiadomości dzięki kluczowi encji.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="messageId">Id wiadomości jaką chcemy pobrać.</param>
        /// <returns>Encja wiadomości.</returns>
        public Message GetMessageById(int messageId)
        {
            return _dataContext.Message.Where(x => (x.Id == messageId)).FirstOrDefault();
        }
    }
}
